/*
 * udpsrv.c
 *
 *  Created on: May 30, 2012
 *      Author: root
 */



#include "unp.h"

#define BUFSIZE  1500

typedef struct {
	uint16_t len;
	uint16_t seqno;
	char payload[1500];
}Packet;

Packet packet;

int main(int argc, char **argv)
{
	int serv_sock;
	uint16_t a = 0;
	int pkloss = 0;

	//char message[BUFSIZE];
	//int str_len;

	struct sockaddr_in serv_addr;
	struct sockaddr_in clnt_addr;
	int clnt_addr_size;

	if(argc != 2){
		printf("Usage : %s <port>\n", argv[0]);
		exit(1);
	}

	serv_sock = socket(PF_INET, SOCK_DGRAM, 0);

	if(serv_sock == -1)
		error_handling("udp socket error");

	memset(&serv_addr, 0, sizeof(serv_addr));

	serv_addr.sin_family = AF_INET;
	serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
	serv_addr.sin_port = htons(atoi(argv[1]));

	if(bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) == -1)
		error_handling("bind error");

	memset(packet.payload,0,sizeof(packet.payload));
	packet.seqno = 0;
	packet.len = 0;

	while(1)
	{
		clnt_addr_size = sizeof(clnt_addr);
		recvfrom(serv_sock, &packet, BUFSIZE, 0, (struct sockaddr*) &clnt_addr, &clnt_addr_size);

		if(packet.seqno != 0 && packet.seqno != a+1)
			pkloss++;

		if(packet.len != 0)
		{
		printf("seqno	: %d\n", packet.seqno);
		printf("len	: %d\n", packet.len);
		printf("payload	: %s\n", packet.payload);
		printf("=======================\n");

		memset(packet.payload, 0, sizeof(packet.payload));
		a = packet.seqno;
		}
		else
		{
			printf("Session End\n");
			printf("packet loss : %d\n", pkloss);
			pkloss = 0;
		}
		//sendto(serv_sock, message, str_len, 0, (struct sockaddr*) &clnt_addr, sizeof(clnt_addr));
	}

	close(serv_sock);

	return 0;
}

void error_handling(char *message)
{
	fputs(message, stderr);
	fputc('\n',stderr);
	exit(1);
}
